class Joi {
  constructor(input, label) {
    this._input = input; //需要校验的数据
    this._label = label; //错误信息标签
    this.errorMessage = "验证通过"; // 错误信息`${this.label}${this.errorMessage}`
    this.pass = true; // 校验是否通过
  }

  // 数据输入
  data(input) {
    if (!this.pass) return this;

    this._input = input;
    return this;
  }

  // 标签输入
  label(label) {
    if (!this.pass) return this;

    this._label = label;
    return this;
  }

  //自定义判断条件校验(传入条件进行判断)
  judge(condition = true, message = "条件不正确") {
    if (!this.pass) return this;

    if (!condition) {
      this.errorMessage = this._label ? this._label + message : message;
      this.pass = false;
    }
    return this;
  }

  // 自定义正则校验
  regExp(reg, message = "格式不正确") {
    return this.judge(reg.test(this._input), message);
  }

  //必填(不为空)
  required(message = "不为空") {
    return this.judge(
      !(/^\s*$/g.test(this._input) || this._input == null),
      message
    );
  }

  // 手机号
  mobile(message = "手机号不正确") {
    const reg = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
    return this.regExp(reg, message);
  }

  // 邮箱校验（不区分大小写）
  email(message = "格式不正确") {
    const reg =
      /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
    return this.judge(reg.test(this._input.toLowerCase()), message);
  }

  //匹配图片
  images(message = "未知图片格式") {
    const reg = /.*?(?:gif|png|jpg|jpeg|webp|svg|psd|bmp|tif)$/i;
    return this.regExp(reg, message);
  }

  //匹配视频
  video(message = "未知视频格式") {
    const reg = /.*?(?:swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)$/i;
    return this.regExp(reg, message);
  }

  //身份证号 二代身份证号(18位数字),最后一位是校验位,可能为数字或字符X
  ID(message = "身份证不合法") {
    const reg =
      /^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$/;
    return this.regExp(reg, message);
  }

  // 整数
  integet(message = "必须为整数") {
    const reg = /^-?[1-9]\d*$/;
    return this.regExp(reg, message);
  }

  // 数字
  number(message = "必须数字格式") {
    const reg = /^\+?[1-9][0-9]+.?[0-9]*$/;
    return this.regExp(reg, message);
  }

  // 字母
  letter(message = "必须是英文") {
    const reg = /^[a-zA-Z]+$/;
    return this.regExp(reg, message);
  }

  // 中文
  chinese(message = "必须是中文") {
    const reg = /^[\u4e00-\u9fa5]+$/g;
    return this.regExp(reg, message);
  }

  // 枚举
  enum(arr = [], message = `值必须为${arr.join(",")}中的一个`) {
    return this.judge(arr.indexOf(this._input) !== -1, message);
  }

  //最小值
  min(num = 0, message = `最小值为${num}`) {
    return this.judge(Number(this._input) >= num, message);
  }

  //最大值
  max(num = 100, message = `最大值为${num}`) {
    return this.judge(Number(this._input) <= num, message);
  }

  // 最小长度
  minLength(length = 6, message = `长度不能小于${length}位`) {
    return this.judge(this._input.length >= length, message);
  }

  // 最大长度
  maxLength(length = 6, message = `长度不能大于${length}位`) {
    return this.judge(this._input.length <= length, message);
  }

  // 固定长度
  length(length = 6, message = `长度必须为${length}位`) {
    return this.judge(this._input.length === length, message);
  }

  //数字/货币金额（支持负数、千分位分隔符）
  currency(message = "格式不正确") {
    const reg =
      /^-?\d+(,\d{3})*(\.\d{1,2})?$/;
    return this.regExp(reg, message);
  }

  //数字/货币金额 (只支持正数、不支持校验千分位分隔符)positive number(正数)
  Pcurrency(message = "格式不正确") {
    const reg =
      /(?:^[1-9]([0-9]+)?(?:\.[0-9]{1,2})?$)|(?:^(?:0)$)|(?:^[0-9]\.[0-9](?:[0-9])?$)/;
    return this.regExp(reg, message);
  }
}

export default Joi;
